Rate Limiting
レートリミット_
Rate Limiter_
/mrsekut-book-4802614063/064 (4章 レートリミッターの設計)
#wip
https://github.com/envoyproxy/ratelimit
https://engineering.classdojo.com/blog/2015/02/06/rolling-rate-limiter/
https://en.wikipedia.org/wiki/Rate_limiting
どこに設置するか
client
ユーザ側で突破しやすい
sever
API Gateway
server内
etc.
GPT-4.icon
Rate Limiter(レートリミッター)は、システムがリソースやAPIを一定の速度でしか使用できないように制限する仕組みです。
1. Rate Limiterの必要性
リソースの保護
サーバーやバックエンドリソースが過剰な負荷を受けないようにするため。
意図的または意図せずに大量のリクエストが送られた場合にシステムを守る。
公平性の確保
リソースを利用するクライアント間で公平性を保つ。
一部のクライアントがシステムを独占するのを防ぐ。
攻撃の軽減
DDoS攻撃やブルートフォース攻撃など、悪意のあるアクセスを制限する。
コストの管理
クラウドサービスのAPI使用量が課金に直結する場合、予期しないコストを抑える。
サーバの数を減らせるmrsekut.icon
無駄なスケールアップを防ぐ
2. Rate Limiterの設計時に意識すべきこと
1. スループットとパフォーマンス
Rate Limiterの処理自体がボトルネックにならないようにする。
高速にリクエストを処理できるよう、適切なデータ構造やキャッシュを使用。
2. 状態の管理
ユーザーごとのリクエスト履歴やカウントをどう保持するか。
分散システムでは、複数のインスタンス間でのデータ共有や整合性の確保が課題。
3. ルールの柔軟性
時間間隔(例えば1秒間、1分間など)や、ユーザー、IPアドレス、APIエンドポイントごとに異なるルールを設定可能にする。
4. エラーハンドリング
レート制限を超えた場合にクライアントに適切なエラーメッセージを返す
429 Too Many Requests
X-Ratelimit-Remaining
X-Ratelimit-Limit
X-Ratelimit-Retry-After
/mrsekut-book-4802614063/083
必要に応じて再試行可能な時間を通知する。
5. スケーラビリティ
トラフィックが増大しても、Rate Limiter自体が安定して動作すること。
3. 一般的なRate Limiterのアルゴリズム
以下はよく使われるアルゴリズムの例です:
Token Bucket
Leaky Bucket
Fixed Window Counter
Sliding Window Log
Sliding Window Counter
/mrsekut-book-4802614063/085
レースコンディション
複数のRate Limiterの同期